home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume12 / ffccc / part04 < prev    next >
Encoding:
Text File  |  1990-05-14  |  47.2 KB  |  1,206 lines

  1. Newsgroups: comp.sources.misc
  2. organization: CERN, Geneva, Switzerland
  3. keywords: fortran
  4. subject: v12i090: Floppy - Fortran Coding Convention Checker Part 04/11
  5. from: julian@cernvax.cern.ch (julian bunn)
  6. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  7.  
  8. Posting-number: Volume 12, Issue 90
  9. Submitted-by: julian@cernvax.cern.ch (julian bunn)
  10. Archive-name: ffccc/part04
  11.  
  12. #!/bin/sh
  13. echo 'Start of Floppy, part 04 of 11:'
  14. echo 'x - ALLPRO.f'
  15. sed 's/^X//' > ALLPRO.f << '/'
  16. X      SUBROUTINE ALLPRO 
  17. X*-----------------------------------------------------------------------
  18. X*   
  19. X*--- Overall control of FLOP run.   
  20. X*   
  21. X*-----------------------------------------------------------------------
  22. X      include 'PARAM.h' 
  23. X      include 'ALCAZA.h' 
  24. X      include 'JOBSUM.h' 
  25. X      include 'FLAGS.h' 
  26. X      include 'STATE.h' 
  27. X*--- print header   
  28. X      CALL HEADER   
  29. X*--- initialize 
  30. X      CALL FLINIT   
  31. X      CALL STADEF   
  32. X*--- read command lines 
  33. X      CALL INDECO   
  34. X      CALL INDECT   
  35. X*--- user total initialization  
  36. X      IF(ACTION(22))  CALL UTINIT   
  37. X*--- start processing   
  38. X   10 CONTINUE  
  39. X*--- process if enough time left (only if CERN flag on) 
  40. X      IF(.NOT.STATUS(4))  THEN  
  41. X*--- read one complete routine  
  42. X         CALL READEC
  43. X*--- process if still something read
  44. X         IF (.NOT.STATUS(2))  THEN  
  45. X*--- count lines
  46. X            DO 20 I=NFLINE(1),NLLINE(NSTAMM)
  47. X               IF (NLTYPE(I).EQ.0) NSTATC(7)=NSTATC(7)+1
  48. X               IF (NLTYPE(I).EQ.1) NSTATC(3)=NSTATC(3)+1
  49. X   20       CONTINUE
  50. X            NSTATC(1)=NSTATC(1)+NLLINE(NSTAMM)-NFLINE(1)+1  
  51. X*--- set pointer and count for routine name list
  52. X            NRNAME=0
  53. X            IRNAME=IGNAME+NGNAME
  54. X*--- process one complete routine   
  55. X            CALL PROCES 
  56. X            IF (NRNAME.GT.0)  THEN  
  57. X               IF (ACTION(25))  THEN
  58. X*--- print list of routine names
  59. X                  WRITE (MPUNIT,10000) SCROUT,NRNAME
  60. X                  IF (ACTION(20))  THEN 
  61. X*--- print name list with types 
  62. X                     CALL PRNAMF(IRNAME+1,IRNAME+NRNAME)
  63. X                  ELSE  
  64. X                     WRITE (MPUNIT,10010) (SNAMES(IRNAME+J),J=1,NRNAME) 
  65. X                  ENDIF 
  66. X               ENDIF
  67. X               IF (ACTION(2))  THEN 
  68. X*--- merge with global namelist 
  69. X                  CALL LMERGE(SNAMES,NAMTYP,.TRUE.,IGNAME,NGNAME,NRNAME)
  70. X                  CALL SUPMUL(SNAMES,NAMTYP,.TRUE.,IGNAME,NGNAME+NRNAME,
  71. X     +            NGNAME)   
  72. X               ENDIF
  73. X            ENDIF   
  74. X            IF(ACTION(27).AND..NOT.STATUS(12))  THEN
  75. X*--- print common block information 
  76. X               CALL PRTCOM  
  77. X            ENDIF   
  78. X*--- write output file  
  79. X            CALL PUTOUT 
  80. X            GOTO 10 
  81. X         ENDIF  
  82. X      ENDIF 
  83. X*--- user total termination 
  84. X      IF(ACTION(22))  CALL UTTERM   
  85. X      CALL SUMMRY   
  86. X10000 FORMAT(//' Routine = ',A8,',  list of',I6,' names'/)  
  87. X10010 FORMAT(1X,10A10)  
  88. X      END   
  89. /
  90. echo 'x - INDECO.f'
  91. sed 's/^X//' > INDECO.f << '/'
  92. X      SUBROUTINE INDECO 
  93. X*-----------------------------------------------------------------------
  94. X*   
  95. X* Complete processing of user commands on input.
  96. X* The input is received from routine INUSER.
  97. X* The output is stored in commons  /FLAGS/, /KEYINP/, and /SKEYNP/  
  98. X*   
  99. X*-----------------------------------------------------------------------
  100. X      include 'PARAM.h' 
  101. X      include 'ALCAZA.h' 
  102. X      include 'STATE.h' 
  103. X      include 'KEYCOM.h' 
  104. X      include 'FLAGS.h' 
  105. X      include 'FLWORK.h' 
  106. X      include 'CLASS.h' 
  107. X      include 'CONDEC.h' 
  108. X*   
  109. X      DIMENSION NSUBKY(MTOTKY),KSUBKY(MTOTKY),KDEFKY(MTOTKY), KACTKY
  110. X     +(MTOTKY),KLISKY(MTOTKY),KKEYLS(MTOTKY),KKEYLG(MTOTKY), KSUBRF 
  111. X     +(MSUBKY),KSUBIX(MSUBKY),KSUBAC(MSUBKY),KSUBLG(MSUBKY), KSUBLS 
  112. X     +(MSUBKY),KDEFAU(7,2),IBIT(3)  
  113. X*   NSUBKY(I) = # of sub-keys of key I  
  114. X*   KSUBKY(I) = start-1 of sub-key list in KSUBRF   
  115. X*   KDEFKY(I) = default flag if no sub-key given
  116. X*   KACTKY(I) = action flag to be set by key I  
  117. X*   KLISKY(I) = cumulative 'type of input' indicator:   
  118. X*               1   integer list given  
  119. X*               2   name list given 
  120. X*               4   string list given   
  121. X*   KKEYLS(I) = for key I, ref. to KDEFAU for numerical default values  
  122. X*   KKEYLG(I) = for key I, no. of numerical default values in KDEFAU
  123. X*   KSUBRF    = ref. list of sub-keys   
  124. X*   KSUBIX(J) = for sub-key number J, 'type of action' indicator:   
  125. X*               -2   insert list of non-executable statements   
  126. X*               -1   insert list of executable statements   
  127. X*               > 0: p, where p is the position of the first integer
  128. X*               behind the sub-key of the integer list (FORMAT=... etc.)
  129. X*   KSUBLG(J) = for sub-key number J, no. of words for default values   
  130. X*   KSUBAC(J) = for sub-key number J, action flag to be set, or zero
  131. X*   KSUBLS(J) = for sub-key J, ref. to default integer list 
  132. X*   KDEFAU(I,J) = for above ref., defaults  
  133. X*   IBIT      = temporary storage for bits from KLISKY  
  134. X      CHARACTER*3 STRKEY(MTOTKY),SUBKEY(MSUBKY) 
  135. X*    STRKEY = list of keys  
  136. X*   SUBKEY = list of sub-keys   
  137. X      CHARACTER STEMP*1,STEMP3*3,SLNAM*(MXNMCH) 
  138. X      DATA STRKEY/'OR;','END','PRI','LIS','OUT','FIR','STA','OPT', 'REP'
  139. X     +,'ROU','NAM','STR','CLA'/ 
  140. X      DATA SUBKEY/'CHA','END','FOR','FUL','GLO','ILL','IND','NUM', 'QUO'
  141. X     +,'RET','SEP','EXE','NEX','PAR','CHA','PAR','FUL','SEP', 'TYP',
  142. X     +'USE','COM','COM','GOT','TRE'/
  143. X      DATA NSUBKY/0,0,4,3,4,0,6,5,0,0,0,0,2/
  144. X      DATA KSUBKY/0,0,0,4,7,11,11,17,22,22,22,22,22/
  145. X      DATA KDEFKY/0,0,5,1,8,0,0,0,0,0,0,0,0/
  146. X      DATA KACTKY/0,0,0,0,0,10,13,0,0,16,18,19,17/  
  147. X      DATA KLISKY/0,0,0,0,0,0,0,0,6,2,2,4,1/
  148. X      DATA KKEYLS/6*0,1,6*0/
  149. X      DATA KKEYLG/6*0,7,6*0/
  150. X      DATA KSUBRF/1,4,6,14,5,11,19,15,16,17,21,2,3,8,10,18,23,24,7,9,   
  151. X     +20,22,12,13/  
  152. X      DATA KSUBIX/0,7,3,0,0,0,1,1,2,5,0,-1,-2,8*0,3,2*0/
  153. X      DATA KSUBLG/0,7,7,0,0,0,3,7,3,7,11*0,3,2*0/   
  154. X      DATA KSUBAC/4,0,0,6,2,3,21,0,11,0,1,0,0,5,7,8,9,14,20,22,23,27,   
  155. X     +28,29/
  156. X      DATA KSUBLS/0,0,0,0,0,0,2,0,2,12*0,2,2*0/ 
  157. X*--- in KDEFAU, under 1:
  158. X*    defaults for statement numbers(2),formats(2),returns(2),end(1) 
  159. X*    under 2: defaults for INDFAC (1), and IBLPAD (1)   
  160. X      DATA KDEFAU/10,10,0,10,0,1,0, 3,1,0,4*0/  
  161. X    
  162. X*   
  163. X      include 'CONDAT.h' 
  164. X*--- read all input commands, pre-process, store in SIMA
  165. X      CALL INUSER   
  166. X*--- check for illegal keys 
  167. X      IPR=0 
  168. X      DO 20 IS=1,NSTAMM 
  169. X         STEMP3=SIMA(NFLINE(IS))(1:3)   
  170. X         DO 10 IC=1,MTOTKY  
  171. X            IF (STEMP3.EQ.STRKEY(IC)) GOTO 20   
  172. X   10    CONTINUE   
  173. X         WRITE (MPUNIT,10020) STEMP3
  174. X         IF (IPR.EQ.0)  THEN
  175. X            WRITE (MPUNIT,10030) STRKEY 
  176. X            IPR=1   
  177. X         ENDIF  
  178. X   20 CONTINUE  
  179. X*--- start decoding 
  180. X      NKEY=0
  181. X*--- loop over global (IORSET=0) and local keys 
  182. X      DO 160 IORSET=0,NORSET
  183. X         IF (IORSET.EQ.0)  THEN 
  184. X            ILOW=3  
  185. X            IUP=MGLOKY  
  186. X            I1=1
  187. X            I2=NSTAMM   
  188. X         ELSE   
  189. X            ILOW=MGLOKY+1   
  190. X            IUP=MTOTKY  
  191. X         ENDIF  
  192. X         DO 150 IKY=ILOW,IUP
  193. X            NSINT=0 
  194. X            NFINT=0 
  195. X            IF (IORSET.NE.0)  THEN  
  196. X               I1=NSSTRT(IORSET)
  197. X               I2=NSEND(IORSET) 
  198. X            ENDIF   
  199. X*--- collect all occurences (either globally, or in this OR-set)
  200. X*    of this key
  201. X            CALL INEXTR(STRKEY(IKY),I1,I2,NL)   
  202. X*--- complete key now in SSTA, length NL (characters), cleaned  
  203. X*    from key-words.
  204. X            IF (NL.LT.0) GOTO 150   
  205. X*--- set bit string for integer list etc.   
  206. X            N=KLISKY(IKY)   
  207. X            DO 30 J=3,1,-1  
  208. X               IBIT(J)=N/2**(J-1)   
  209. X               N=N-IBIT(J)*2**(J-1) 
  210. X   30       CONTINUE
  211. X*--- count  
  212. X            IF (IORSET.EQ.0)  THEN  
  213. X               NGLSET=NGLSET+1  
  214. X            ELSE
  215. X               IF (NORCOM(IORSET).EQ.0) KORCOM(IORSET)=NKEY 
  216. X               NORCOM(IORSET)=NORCOM(IORSET)+1  
  217. X            ENDIF   
  218. X            NKEY=NKEY+1 
  219. X            KEYREF(NKEY,1)=IKY  
  220. X*--- set action flags   
  221. X            IF (KACTKY(IKY).NE.0)  THEN 
  222. X               ACTION(KACTKY(IKY))=.TRUE.   
  223. X            ENDIF   
  224. X*--- defaults for keys  
  225. X            IF (KKEYLS(IKY).GT.0.AND.KEYREF(NKEY,2).EQ.0)  THEN 
  226. X               NKS=KKEYLG(IKY)  
  227. X               KEYREF(NKEY,2)=NKS   
  228. X               KEYREF(NKEY,3)=NKYINT
  229. X               KK=KKEYLS(IKY)   
  230. X               DO 40 JJ=1,NKS   
  231. X                  NKYINT=NKYINT+1   
  232. X                  KEYINT(NKYINT)=KDEFAU(JJ,KK)  
  233. X   40          CONTINUE 
  234. X            ENDIF   
  235. X*--- sub-keys   
  236. X            NSFD=0  
  237. X            DO 80 JS=1,NSUBKY(IKY)  
  238. X               JSC=KSUBKY(IKY)+JS   
  239. X               JSN=KSUBRF(JSC)  
  240. X               IF(NL.EQ.0)  THEN
  241. X                  IND=0 
  242. X               ELSE 
  243. X                  IND=INDEX(SSTA(:NL),SUBKEY(JSN))  
  244. X               ENDIF
  245. X               IF (IND.GT.0)  THEN  
  246. X*--- sub-key found  
  247. X                  NSFD=1
  248. X                  CALL SKIPTP(2,SSTA,IND,NL,.FALSE.,JPT,ILEV)   
  249. X                  IF (KSUBIX(JSN).GT.0)  THEN   
  250. X*--- integers following 
  251. X                     IF (KEYREF(NKEY,2).EQ.0)  THEN 
  252. X*--- get length and reserve space   
  253. X                        NKS=KSUBLG(JSN) 
  254. X                        KEYREF(NKEY,2)=NKS  
  255. X                        KEYREF(NKEY,3)=NKYINT   
  256. X*--- set default values 
  257. X                        KK=KSUBLS(JSN)  
  258. X                        DO 50 JJ=1,NKS  
  259. X                           NKYINT=NKYINT+1  
  260. X                           KEYINT(NKYINT)=KDEFAU(JJ,KK) 
  261. X   50                   CONTINUE
  262. X                     ENDIF  
  263. X*--- integer position   
  264. X                     IPOS=KSUBIX(JSN)   
  265. X   60                CONTINUE   
  266. X                     CALL GETNBL(SSTA(JPT+1:NL),STEMP,N)
  267. X                     IF(N.GT.0.AND.(STEMP.EQ.'='
  268. X     +               .OR.NUMCH(STEMP)))  THEN   
  269. X*--- next comma position
  270. X                        JCOM=JPT+INDEX(SSTA(JPT+1:NL),',')  
  271. X                        IF(JCOM.EQ.JPT) JCOM=NL 
  272. X*--- get integer
  273. X                        CALL GETINT(SSTA,JPT,JCOM,KFCH,KLCH,NN) 
  274. X                        IF (KFCH.GT.0) THEN 
  275. X*--- integer found  
  276. X                           IF(NN.GT.0) KEYINT(KEYREF(NKEY,3)+IPOS)=NN   
  277. X                           IPOS=IPOS+1  
  278. X                           JPT=JCOM 
  279. X                           IF (IPOS.LE.NKS) GOTO 60 
  280. X                        ENDIF   
  281. X                     ENDIF  
  282. X                  ELSEIF(KSUBIX(JSN).LT.0)  THEN
  283. X*--- EXE or NEX, add corresponding classes  
  284. X                     NTYP=KSUBIX(JSN)+2 
  285. X*--- collect in IWS first   
  286. X                     DO 70 JCL=1,NCLASS 
  287. X                        IF (ISTMDS(11,JCL).EQ.NTYP)  THEN   
  288. X                           NSINT=NSINT+1
  289. X                           IWS(NSINT)=ISTMDS(6,JCL) 
  290. X                        ENDIF   
  291. X   70                CONTINUE   
  292. X                  ENDIF 
  293. X                  IF (KSUBAC(JSN).GT.0)  THEN   
  294. X*--- action flag
  295. X                     ACTION(KSUBAC(JSN))=.TRUE. 
  296. X                  ENDIF 
  297. X               ENDIF
  298. X*--- end of sub-key loop
  299. X   80       CONTINUE
  300. X            IF (NSFD.EQ.0)  THEN
  301. X*--- no sub-key found - set default flag if any 
  302. X               IF (KDEFKY(IKY).GT.0) ACTION(KDEFKY(IKY))=.TRUE. 
  303. X            ENDIF   
  304. X*--- get integers if any
  305. X            IF (IBIT(1).NE.0)  THEN 
  306. X               JPT=0
  307. X               KADD=0   
  308. X   90          CONTINUE 
  309. X               CALL GETINT(SSTA,JPT+1,NL,KFCH,KLCH,NN)  
  310. X               IF (KFCH.GT.0)  THEN 
  311. X*--- integer found  
  312. X                  JPT=KLCH  
  313. X                  IF (KADD.EQ.0)  THEN  
  314. X                     NSINT=NSINT+1  
  315. X                     IWS(NSINT)=NN  
  316. X                  ELSE  
  317. X                     NFINT=NFINT+1  
  318. X                     IWS(KADD+NFINT)=NN 
  319. X                  ENDIF 
  320. X                  IF (JPT.LT.NL)  THEN  
  321. X*--- store those after IF ref. separately   
  322. X                     IF (SSTA(JPT+1:JPT+1).EQ.'('.AND.KADD.EQ.0.AND.
  323. X     +               ISTMDS(6,IIF).EQ.NN) THEN  
  324. X                        KADD=MXKINT 
  325. X                     ELSEIF (SSTA(JPT+1:JPT+1).EQ.')')  THEN
  326. X                        KADD=0  
  327. X                     ENDIF  
  328. X                     GOTO 90
  329. X                  ENDIF 
  330. X               ENDIF
  331. X*--- store integers (classes),in the following way: 
  332. X*  # of simple, plus those following, # of classes behind IF,   
  333. X*  plus those following 
  334. X               IF (NSINT.GT.0)  THEN
  335. X                  KEYREF(NKEY,3)=NKYINT 
  336. X*--- sort and suppress multiples
  337. X                  CALL SORTSP(NSINT,IWS,N)  
  338. X                  KEYINT(NKYINT+1)=N
  339. X                  DO 100 J=1,N  
  340. X                     KEYINT(NKYINT+J+1)=IWS(J)  
  341. X  100             CONTINUE  
  342. X                  CALL SORTSP(NFINT,IWS(MXKINT+1),NN)   
  343. X                  KEYINT(NKYINT+N+2)=NN 
  344. X                  DO 110 J=1,NN 
  345. X                     KEYINT(NKYINT+N+J+2)=IWS(MXKINT+J) 
  346. X  110             CONTINUE  
  347. X                  KEYREF(NKEY,2)=N+NN+2 
  348. X                  NKYINT=NKYINT+KEYREF(NKEY,2)  
  349. X               ENDIF
  350. X            ENDIF   
  351. X*--- get names if any   
  352. X            IF (IBIT(2).NE.0)  THEN 
  353. X               IPT=0
  354. X  120          CONTINUE 
  355. X*--- find name outside string   
  356. X               CALL GETNAM(SSTA,IPT+1,NL,KFCH,KLCH) 
  357. X               IF (KFCH.GT.0)  THEN 
  358. X*--- name found 
  359. X                  IF (KEYREF(NKEY,4).EQ.0) KEYREF(NKEY,5)=NKYNAM
  360. X                  IF (NKYNAM.EQ.MXKNAM)  THEN   
  361. X                     WRITE (MPUNIT,10000) NKYNAM
  362. X                     GOTO 150   
  363. X                  ENDIF 
  364. X                  SLNAM='        '  
  365. X                  SLNAM(:KLCH+1-KFCH)=SSTA(KFCH:KLCH)   
  366. X                  IPT=KLCH  
  367. X*--- enter name in table (alphabetic for each key)  
  368. X                  K=KEYREF(NKEY,5)  
  369. X                  CALL NAMTAB(SLNAM,SKEYLS(K+1),NKYNAM-K,IPOS)  
  370. X                  IF (IPOS.GT.0)  THEN  
  371. X*--- name has been entered in table (otherwise already in)  
  372. X                     IPOS=IPOS+K
  373. X                     DO 130 JJ=1,2  
  374. X                        DO 130 J=NKYNAM,IPOS,-1 
  375. X                           KNAMRF(J+1,JJ)=KNAMRF(J,JJ)  
  376. X  130                CONTINUE   
  377. X                     NKYNAM=NKYNAM+1
  378. X                     KEYREF(NKEY,4)=KEYREF(NKEY,4)+1
  379. X                     KNAMRF(IPOS,1)=0   
  380. X                     KNAMRF(IPOS,2)=0   
  381. X                  ENDIF 
  382. X*--- check for string following if any  
  383. X                  IF (IBIT(3).NE.0)  THEN   
  384. X                     IF (SSTA(IPT+1:IPT+1).EQ.'{')  THEN
  385. X*--- delete string indicator (for string scan later on) 
  386. X                        SSTA(IPT+1:IPT+1)=' '   
  387. X                        IND=INDEX(SSTA(IPT+1:NL),'}')   
  388. X                        IF (IND.GT.2.AND.IPOS.GT.0)  THEN   
  389. X                           CALL INDECS(IPT+1,IPT+IND,*150)  
  390. X                           KNAMRF(IPOS,1)=NKYSTR
  391. X                        ENDIF   
  392. X                        IPT=IPT+MAX(IND,1)  
  393. X                     ENDIF  
  394. X*--- look for replacement string
  395. X                     IF (IPT+2.LT.NL.AND.SSTA(IPT+1:IPT+2).EQ.'={') 
  396. X     +               THEN   
  397. X                        IPT=IPT+1   
  398. X                        SSTA(IPT+1:IPT+1)=' '   
  399. X                        IND=INDEX(SSTA(IPT+1:NL),'}')   
  400. X                        IF (IND.GT.2.AND.IPOS.GT.0)  THEN   
  401. X                           CALL INDECS(IPT+1,IPT+IND,*150)  
  402. X                           KNAMRF(IPOS,2)=NKYSTR
  403. X                           ACTION(15)=.TRUE.
  404. X                        ENDIF   
  405. X                        IPT=IPT+MAX(IND,1)  
  406. X                     ENDIF  
  407. X                  ENDIF 
  408. X                  GOTO 120  
  409. X               ENDIF
  410. X            ENDIF   
  411. X*--- check for strings to be replaced   
  412. X            IF (IBIT(3).NE.0)  THEN 
  413. X               IPT=0
  414. X  140          CONTINUE 
  415. X               IND=INDEX(SSTA(IPT+1:NL),'{')
  416. X               IF (IND.GT.0)  THEN  
  417. X                  IPT=IPT+IND-1 
  418. X                  IND=INDEX(SSTA(IPT+1:NL),'}') 
  419. X                  IF (IND.GT.2)  THEN   
  420. X                     IF (NKYCHR.EQ.MXKNAM)  THEN
  421. X                        WRITE (MPUNIT,10010) NKYCHR 
  422. X                        GOTO 150
  423. X                     ENDIF  
  424. X                     CALL INDECS(IPT+1,IPT+IND,*150)
  425. X                     IF (KEYREF(NKEY,6).EQ.0) KEYREF(NKEY,7)=NKYCHR 
  426. X                     KEYREF(NKEY,6)=KEYREF(NKEY,6)+1
  427. X                     NKYCHR=NKYCHR+1
  428. X                     KSTREF(NKYCHR,1)=NKYSTR
  429. X                  ENDIF 
  430. X                  IPT=IPT+MAX(IND,1)
  431. X*--- look for replacement string
  432. X                  IF (IPT+2.LT.NL.AND.SSTA(IPT+1:IPT+2).EQ.'={')  THEN  
  433. X                     IPT=IPT+1  
  434. X                     IND=INDEX(SSTA(IPT+1:NL),'}')  
  435. X                     IF (IND.GT.2)  THEN
  436. X                        CALL INDECS(IPT+1,IPT+IND,*150) 
  437. X                        KSTREF(NKYCHR,2)=NKYSTR 
  438. X                        ACTION(12)=.TRUE.   
  439. X                     ENDIF  
  440. X                     IPT=IPT+MAX(IND,1) 
  441. X                  ENDIF 
  442. X                  GOTO 140  
  443. X               ENDIF
  444. X            ENDIF   
  445. X  150    CONTINUE   
  446. X  160 CONTINUE  
  447. X*--- look for indentation multiple request  
  448. X      INDFAC=0  
  449. X      IBLPAD=1  
  450. X      DO 170 I=1,NGLSET 
  451. X         IF (KEYREF(I,1).EQ.8) GOTO 180 
  452. X  170 CONTINUE  
  453. X      GOTO 190  
  454. X  180 CONTINUE  
  455. X      IF(KEYREF(I,2).GT.0)  THEN
  456. X         IF(ACTION(21))  INDFAC=MIN(5,KEYINT(KEYREF(I,3)+1))
  457. X         IF(ACTION(11))  IBLPAD=MIN(10,KEYINT(KEYREF(I,3)+2))   
  458. X         IF(ACTION(27))  ICBPRT=KEYINT(KEYREF(I,3)+3)   
  459. X      ENDIF 
  460. X  190 CONTINUE  
  461. X      ACTION(25)=ACTION(1)  
  462. X      ACTION(26)=ACTION(2)  
  463. X*--- allow flags and options to be set directly 
  464. X      CALL SETREQ   
  465. X      ACTION(24)=ACTION(24).OR.ACTION(27).OR.ACTION(29) 
  466. X      ACTION(27)=ACTION(27).AND..NOT.ACTION(29) 
  467. X      ACTION(3)=ACTION(3).OR.ACTION(6)  
  468. X*--- namelist / routine if common block option given, dito type 
  469. X      ACTION(1)=ACTION(1).OR.ACTION(24) 
  470. X      ACTION(20)=ACTION(20).OR.ACTION(24)   
  471. X*--- print flags
  472. X      ACTION(5)=ACTION(5).OR.ACTION(6)  
  473. X      ACTION(4)=ACTION(4).OR.ACTION(5)  
  474. X10000 FORMAT(/1X,8('*=*='),' WARNING - max. no. of names =', I5,
  475. X     +' reached in commands, rest ignored') 
  476. X10010 FORMAT(/1X,8('*=*='),' WARNING - max. no. of strings =', I5,  
  477. X     +' reached in commands, rest ignored') 
  478. X10020 FORMAT(/' *=*=*=*= WARNING - illegal key "',A,'" ignored',/)  
  479. X10030 FORMAT(/' valid keys are:'/(1X,10A10))
  480. X      END   
  481. /
  482. echo 'x - STADEF.f'
  483. sed 's/^X//' > STADEF.f << '/'
  484. X      SUBROUTINE STADEF 
  485. X*-----------------------------------------------------------------------
  486. X*   
  487. X*--- initialises the statement classification by reading
  488. X*--- the statement descriptions from internal buffers (data 
  489. X*--- statement) and filling the necessary arrays.   
  490. X*   
  491. X*--- output 
  492. X*    all variables in common/CLASS/ 
  493. X*    SSTM       in COMMON/ALCAZA/   
  494. X*    SNAM       in COMMON/ALCAZA/   
  495. X*   
  496. X*-----------------------------------------------------------------------
  497. X      include 'PARAM.h' 
  498. X      include 'ALCAZA.h' 
  499. X      include 'CLASS.h' 
  500. X      include 'FLWORK.h' 
  501. X      include 'CONDEC.h' 
  502. X      LOGICAL DOITFL
  503. X      CHARACTER SDESCR(MXSTAT)*86,STEMP*1,SLAST*1,STR1*24,STR2*20   
  504. X*--- SDESCR contains the FORTRAN statement description  
  505. X*--- important for new entries: 
  506. X*   - scan order is top - down (see e.g. INTEGER - INTEGERFUNCTION etc.)
  507. X*   - order is alphabetic   
  508. X*   - special characters at the end 
  509. X*   
  510. X*   The numbers correspond to ISTMDS(6)...ISTMDS(22)
  511. X*   
  512. X*                         no.+prty+name              descrpt.   
  513. X*      l u s x n k h  type information  
  514. X      DATA SDESCR(  1)/' 1 0 ASSIGN                  ASSIGN@TO          DEF 
  515. X     +99 0 1 1 2 0 0  0  1  0  0  0  0  0  0'/                          DEF 
  516. X      DATA SDESCR(  2)/' 3 0 BACKSPACE               DITO               DEF 
  517. X     +99 0 0 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  518. X      DATA SDESCR(  3)/' 4 0 BLOCKDATA               DITO               DEF 
  519. X     +99 0 0 0 1 2 1  0  1 14  0  0  0  0  0'/                          DEF 
  520. X      DATA SDESCR(  4)/' 5 0 BUFFERIN                DITO               DEF 
  521. X     +99 0 0 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  522. X      DATA SDESCR(  5)/' 6 0 BUFFEROUT               DITO               DEF 
  523. X     +99 0 0 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  524. X      DATA SDESCR(  6)/'15 0 CONTINUE                DITO               DEF 
  525. X     +99 0 0 1 0 2 0  0  0  0  0  0  0  0  0'/                          DEF 
  526. X      DATA SDESCR(  7)/' 7 0 CALL                    DITO               DEF 
  527. X     +99 0 5 1 2 2 0  1  1 15  2  0 17  0  0'/                          DEF 
  528. X      DATA SDESCR(  8)/'12 0 COMMON                  DITO               DEF 
  529. X     +99 0 0 0 2 2 0 21  1  8  3  0 18 20  0'/                          DEF 
  530. X      DATA SDESCR(  9)/'14 0 COMPLEXFUNCTION         COMPLEX#FUNCTION   DEF 
  531. X     +99 0 0 0 2 0 1  1  3  4 17 21  2  0 19'/                          DEF 
  532. X      DATA SDESCR( 10)/'13 0 COMPLEX                 COMPLEX*@          DEF 
  533. X     +99 0 0 0 2 0 0 10  2  4 18  0  0  0  0'/                          DEF 
  534. X      DATA SDESCR( 11)/'13 0 COMPLEX                 DITO               DEF 
  535. X     +99 0 0 0 2 2 0 10  2  4 18  0  0  0  0'/                          DEF 
  536. X      DATA SDESCR( 12)/' 9 0 CHARACTERFUNCTION       CHARACTER#FUNCTION DEF 
  537. X     +99 0 0 0 2 0 1  1  3  6 17 21  2  0 19'/                          DEF 
  538. X      DATA SDESCR( 13)/' 8 0 CHARACTER               CHARACTER*@        DEF 
  539. X     +99 0 0 0 2 0 0 10  2  6 18  0  0  0  0'/                          DEF 
  540. X      DATA SDESCR( 14)/' 8 0 CHARACTER               DITO               DEF 
  541. X     +99 0 0 0 2 2 0 10  2  6 18  0  0  0  0'/                          DEF 
  542. X      DATA SDESCR( 15)/'10 0 CLOSE                   DITO               DEF 
  543. X     +99 0 4 1 2 3 0  0  2  0 17  0  0  0  0'/                          DEF 
  544. X      DATA SDESCR( 16)/'16 0 DATA                    DITO               DEF 
  545. X     +99 0 0 0 2 2 0  0  1  0  0  0  0  0  0'/                          DEF 
  546. X      DATA SDESCR( 17)/'19 0 DIMENSION               DITO               DEF 
  547. X     +99 0 0 0 2 2 0 10  2  0 18  0  0  0  0'/                          DEF 
  548. X      DATA SDESCR( 18)/'20 1 DO                      DO@,               DEF 
  549. X     + 3 0 1 1 2 0 0  0  2  0 17  0  0  0  0'/                          DEF 
  550. X      DATA SDESCR( 19)/'20 2 DO                      DO@?=!,            DEF 
  551. X     + 3 0 1 1 2 0 0  0  2  0 17  0  0  0  0'/                          DEF 
  552. X      DATA SDESCR( 20)/'17 0 DECODE                  DITO               DEF 
  553. X     +99 0 4 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  554. X      DATA SDESCR( 21)/'22 0 DOUBLEPRECISIONFUNCTION DITO               DEF 
  555. X     +99 0 0 0 2 2 1  1  3  5 17 21  2  0 19'/                          DEF 
  556. X      DATA SDESCR( 22)/'21 0 DOUBLEPRECISION         DITO               DEF 
  557. X     +99 0 0 0 2 2 0 10  2  5 18  0  0  0  0'/                          DEF 
  558. X      DATA SDESCR( 23)/'26 0 END                     END;               DEF 
  559. X     +99 0 0 1 0 0 0  0  0  0  0  0  0  0  0'/                          DEF 
  560. X      DATA SDESCR( 24)/'27 0 ENDIF                   DITO               DEF 
  561. X     +99 0 0 1 0 2 0  0  0  0  0  0  0  0  0'/                          DEF 
  562. X      DATA SDESCR( 25)/'28 0 ENDFILE                 DITO               DEF 
  563. X     +99 0 0 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  564. X      DATA SDESCR( 26)/'29 0 ENTRY                   DITO               DEF 
  565. X     +99 0 0 0 2 2 0  1  2  0 16  1  0  0  0'/                          DEF 
  566. X      DATA SDESCR( 27)/'30 0 EQUIVALENCE             DITO               DEF 
  567. X     +99 0 0 0 2 2 0  0  1  0  0  0  0  0  0'/                          DEF 
  568. X      DATA SDESCR( 28)/'31 0 EXTERNAL                DITO               DEF 
  569. X     +99 0 0 0 2 2 0  0  1 12  0  0  0  0  0'/                          DEF 
  570. X      DATA SDESCR( 29)/'23 0 ELSE                    ELSE;              DEF 
  571. X     +99 0 0 1 0 0 0  0  0  0  0  0  0  0  0'/                          DEF 
  572. X      DATA SDESCR( 30)/'24 0 ELSEIF                  ELSEIF(>)THEN;     DEF 
  573. X     + 6 4 0 1 2 0 0  0  2  0 17  0  0  0  0'/                          DEF 
  574. X      DATA SDESCR( 31)/'25 0 ENCODE                  DITO               DEF 
  575. X     +99 0 4 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  576. X      DATA SDESCR( 32)/'33 0 FORMAT                  DITO               DEF 
  577. X     +99 0 0 0 0 2 0  0  0  0  0  0  0  0  0'/                          DEF 
  578. X      DATA SDESCR( 33)/'34 0 FUNCTION                DITO               DEF 
  579. X     +99 0 0 0 2 2 1  1  2  0 17  2  0 19  0'/                          DEF 
  580. X      DATA SDESCR( 34)/'37 0 GOTO-(UNCOND.)          GOTO@              DEF 
  581. X     +99 0 1 1 0 0 0  0  0  0  0  0  0  0  0'/                          DEF 
  582. X      DATA SDESCR( 35)/'36 0 GOTO-(COMP.)            GOTO(              DEF 
  583. X     +99 0 2 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  584. X      DATA SDESCR( 36)/'35 0 GOTO-(ASS.)             GOTO&              DEF 
  585. X     + 4 0 2 1 2 0 0  0  1  0  0  0  0  0  0'/                          DEF 
  586. X      DATA SDESCR( 37)/'39 0 IF-(BLOCK)              IF(>)THEN;         DEF 
  587. X     + 3 4 0 1 2 0 0  0  2  0 17  0  0  0  0'/                          DEF 
  588. X      DATA SDESCR( 38)/'40 0 IF-(LOGICAL)            IF(>)&             DEF 
  589. X     + 3 0 0 1 2 0 0  0  2  0 17  0  0  0  0'/                          DEF 
  590. X      DATA SDESCR( 39)/'38 0 IF-(ARITM.)             IF(>)@             DEF 
  591. X     + 3 0 3 1 2 0 0  0  2  0 17  0  0  0  0'/                          DEF 
  592. X      DATA SDESCR( 40)/'69 0 ILLEGAL                                    DEF 
  593. X     + 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0'/                          DEF 
  594. X      DATA SDESCR( 41)/'44 0 INTEGERFUNCTION         DITO               DEF 
  595. X     +99 0 0 0 2 2 1  1  3  1 17 21  2  0 19'/                          DEF 
  596. X      DATA SDESCR( 42)/'43 0 INTEGER                 INTEGER*@          DEF 
  597. X     +99 0 0 0 2 0 0 10  2  1 18  0  0  0  0'/                          DEF 
  598. X      DATA SDESCR( 43)/'43 0 INTEGER                 DITO               DEF 
  599. X     +99 0 0 0 2 2 0 10  2  1 18  0  0  0  0'/                          DEF 
  600. X      DATA SDESCR( 44)/'41 0 IMPLICIT                DITO               DEF 
  601. X     +99 0 0 0 0 2 0  2  0  0  0  0  0  0  0'/                          DEF 
  602. X      DATA SDESCR( 45)/'42 0 INQUIRE                 DITO               DEF 
  603. X     +99 0 4 1 2 3 0  0  1  0  0  0  0  0  0'/                          DEF 
  604. X      DATA SDESCR( 46)/'45 0 INTRINSIC               DITO               DEF 
  605. X     +99 0 0 0 2 2 0  0  1 11  0  0  0  0  0'/                          DEF 
  606. X      DATA SDESCR( 47)/'48 0 LOGICALFUNCTION         DITO               DEF 
  607. X     +99 0 0 0 2 2 1  1  3  3 17 21  2  0 19'/                          DEF 
  608. X      DATA SDESCR( 48)/'47 0 LOGICAL                 LOGICAL*@          DEF 
  609. X     +99 0 0 0 2 0 0 10  2  3 18  0  0  0  0'/                          DEF 
  610. X      DATA SDESCR( 49)/'47 0 LOGICAL                 DITO               DEF 
  611. X     +99 0 0 0 2 2 0 10  2  3 18  0  0  0  0'/                          DEF 
  612. X      DATA SDESCR( 50)/'46 0 LEVEL                   DITO               DEF 
  613. X     +99 0 0 0 2 2 0  0  1  0  0  0  0  0  0'/                          DEF 
  614. X      DATA SDESCR( 51)/'49 0 NAMELIST                DITO               DEF 
  615. X     +99 0 0 0 2 2 0  1  1  9  1  0  0  0  0'/                          DEF 
  616. X      DATA SDESCR( 52)/'50 0 OPEN                    DITO               DEF 
  617. X     +99 0 4 1 2 3 0  0  1  0  0  0  0  0  0'/                          DEF 
  618. X      DATA SDESCR( 53)/'54 0 PRINT                   DITO               DEF 
  619. X     +99 0 1 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  620. X      DATA SDESCR( 54)/'52 0 PARAMETER               DITO               DEF 
  621. X     +99 0 0 0 2 2 0  0  2  0  7  0  0  0  0'/                          DEF 
  622. X      DATA SDESCR( 55)/'53 0 PAUSE                   DITO               DEF 
  623. X     +99 0 0 1 0 2 0  0  0  0  0  0  0  0  0'/                          DEF 
  624. X      DATA SDESCR( 56)/'55 0 PROGRAM                 DITO               DEF 
  625. X     +99 0 0 0 1 2 1  0  1 13  0  0  0  0  0'/                          DEF 
  626. X      DATA SDESCR( 57)/'56 0 PUNCH                   DITO               DEF 
  627. X     +99 0 1 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  628. X      DATA SDESCR( 58)/'58 0 READ(                   DITO               DEF 
  629. X     +99 0 4 1 2 3 0  0  2  0 17  0  0  0  0'/                          DEF 
  630. X      DATA SDESCR( 59)/'57 0 READ                    DITO               DEF 
  631. X     +99 0 1 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  632. X      DATA SDESCR( 60)/'60 0 REALFUNCTION            DITO               DEF 
  633. X     +99 0 0 0 2 2 1  1  3  2 17 21  2  0 19'/                          DEF 
  634. X      DATA SDESCR( 61)/'59 0 REAL                    REAL*@             DEF 
  635. X     +99 0 0 0 2 0 0 10  2  2 18  0  0  0  0'/                          DEF 
  636. X      DATA SDESCR( 62)/'59 0 REAL                    DITO               DEF 
  637. X     +99 0 0 0 2 2 0 10  2  2 18  0  0  0  0'/                          DEF 
  638. X      DATA SDESCR( 63)/'61 0 RETURN                  DITO               DEF 
  639. X     +99 0 0 1 0 2 0  0  0  0  0  0  0  0  0'/                          DEF 
  640. X      DATA SDESCR( 64)/'62 0 REWIND                  DITO               DEF 
  641. X     +99 0 0 1 2 2 0  0  2  0 17  0  0  0  0'/                          DEF 
  642. X      DATA SDESCR( 65)/'63 0 SAVE                    DITO               DEF 
  643. X     +99 0 0 0 2 2 0  0  1  0  0  0  0  0  0'/                          DEF 
  644. X      DATA SDESCR( 66)/'65 0 STOP                    DITO               DEF 
  645. X     +99 0 0 1 0 2 0  0  0  0  0  0  0  0  0'/                          DEF 
  646. X      DATA SDESCR( 67)/'66 0 SUBROUTINE              DITO               DEF 
  647. X     +99 0 0 0 2 2 1  1  1 15  2  0 19  0  0'/                          DEF 
  648. X      DATA SDESCR( 68)/'68 0 WRITE                   DITO               DEF 
  649. X     +99 0 4 1 2 3 0  0  2  0 17  0  0  0  0'/                          DEF 
  650. X      DATA SDESCR( 69)/' 2 3 ASSIGNMENT              ?=                 DEF 
  651. X     + 0 0 0 1 2 0 0  1  1  0  2  0 17  0  0'/                          DEF 
  652. X      DATA SDESCR( 70)/' 2 4 ASSIGNMENT              ?(>)=              DEF 
  653. X     + 0 0 0 1 2 0 0  1  2  0 10  2  0 17  0'/                          DEF 
  654. X      DATA SDESCR( 71)/' 2 5 ASSIGNMENT              ?(>)(>)=           DEF 
  655. X     + 0 0 0 1 2 0 0  1  1  0  2  0 17  0  0'/                          DEF 
  656. X      DATA SLAST/' '/   
  657. X      DATA DOITFL/.TRUE./   
  658. X      include 'CONDAT.h' 
  659. X*   
  660. X*--- do it only once
  661. X*   
  662. X      IF(DOITFL)  THEN  
  663. X         DOITFL=.FALSE. 
  664. X         NHEADR=0   
  665. X         NPRIOR=0   
  666. X         NPNAM=0
  667. X         NPSTM=0
  668. X         NCLASS=MXSTAT  
  669. X         DO 10 I=1,27   
  670. X            IALPHA(1,I)=0   
  671. X            IALPHA(2,I)=-1  
  672. X   10    CONTINUE   
  673. X         DO 30 I=1,MXSTAT   
  674. X            READ (SDESCR(I),'(2I2,44X,7I2,10I3)') (ISTMDS(J,I),J=6, 
  675. X     +      MCLASS) 
  676. X            NP=ISTMDS(7,I)  
  677. X            IF (NP.GT.0.AND.NP.LE.NCLASS)  THEN 
  678. X               NPRIOR=NPRIOR+1  
  679. X               IPRIOR(NP)=I 
  680. X            ENDIF   
  681. X            READ (SDESCR(I),'(5X,A24,A20)') STR1,STR2   
  682. X            NST1=INDEX(STR1,' ')-1  
  683. X            NST2=INDEX(STR2,' ')-1  
  684. X            SNAM(NPNAM+1:NPNAM+NST1)=STR1   
  685. X            ISTMDS(1,I)=NPNAM+1 
  686. X            NPNAM=NPNAM+NST1
  687. X            ISTMDS(2,I)=NPNAM   
  688. X            IF (NST2.EQ.0)  THEN
  689. X*--- statement descriptor blank - indicate  
  690. X               ISTMDS(3,I)=0
  691. X               IF (ISTMDS(6,I).EQ.69) ILL=I 
  692. X            ELSEIF (STR2(1:4).EQ.'DITO')  THEN  
  693. X*--- use name as descriptor 
  694. X               SSTM(NPSTM+1:NPSTM+NST1)=STR1
  695. X               ISTMDS(3,I)=NPSTM+1  
  696. X               NPSTM=NPSTM+NST1 
  697. X               ISTMDS(4,I)=NPSTM
  698. X            ELSE
  699. X               SSTM(NPSTM+1:NPSTM+NST2)=STR2
  700. X               ISTMDS(3,I)=NPSTM+1  
  701. X               NPSTM=NPSTM+NST2 
  702. X               ISTMDS(4,I)=NPSTM
  703. X            ENDIF   
  704. X*--- set some class references  
  705. X            IF (ISTMDS(6,I).EQ.40)  THEN
  706. X*--- logical IF 
  707. X               IIF=I
  708. X            ELSEIF (ISTMDS(6,I).EQ.26)  THEN
  709. X*--- END statement  
  710. X               IEND=I   
  711. X            ELSEIF (ISTMDS(6,I).EQ.33)  THEN
  712. X*--- FORMAT 
  713. X               IFORMT=I 
  714. X            ELSEIF (ISTMDS(6,I).EQ.61)  THEN
  715. X*--- RETURN 
  716. X               IRETUR=I 
  717. X            ENDIF   
  718. X*--- get start of alphabetic group  
  719. X            STEMP=SSTM(ISTMDS(3,I):)
  720. X            IF (ISTMDS(3,I).NE.0)  THEN 
  721. X               IF (STEMP.NE.SLAST)  THEN
  722. X                  IF (SPECCH(STEMP))  THEN  
  723. X                     K=27   
  724. X                  ELSE  
  725. X                     K=ICVAL(STEMP) 
  726. X                  ENDIF 
  727. X                  IALPHA(1,K)=I 
  728. X                  IF (SLAST.NE.' ')  THEN   
  729. X                     K=ICVAL(SLAST) 
  730. X                     IALPHA(2,K)=I-1
  731. X                  ENDIF 
  732. X                  SLAST=STEMP   
  733. X               ENDIF
  734. X            ENDIF   
  735. X            K=ISTMDS(3,I)-1 
  736. X*--- find and store last alphabetic ch. in descr.   
  737. X            DO 20 J=ISTMDS(3,I),ISTMDS(4,I) 
  738. X               IF (ALPHCH(SSTM(J:J))) K=J   
  739. X   20       CONTINUE
  740. X            ISTMDS(5,I)=K   
  741. X*--- routine headers
  742. X            IF (ISTMDS(14,I).NE.0)  THEN
  743. X               NHEADR=NHEADR+1  
  744. X               IHEADR(NHEADR)=I 
  745. X            ENDIF   
  746. X   30    CONTINUE   
  747. X         IALPHA(2,27)=NCLASS
  748. X*--- end of IF(DOITFL)  following   
  749. X      ENDIF 
  750. X      END   
  751. /
  752. echo 'x - floppy.vmsfor'
  753. sed 's/^X//' > floppy.vmsfor << '/'
  754. X      PROGRAM FLOPPY
  755. XC-------------------------------------------------------------------------
  756. XC Floppy VAX VMS interface routine.
  757. XC Sets up various required input files for Floppy.
  758. XC 
  759. XC Julian Bunn 1987
  760. XC-------------------------------------------------------------------------
  761. X      PARAMETER (MLEN=256,MXLIN=80)
  762. X      INTEGER*4 STATUS,CLI$GET_VALUE,CLI$PRESENT
  763. X      INTEGER*4 LIB$FIND_FILE,LIB$FIND_FILE_END
  764. X      INCLUDE '($SSDEF)'
  765. X      INCLUDE '($RMSDEF)'
  766. X      INCLUDE '($LBRDEF)'
  767. X      EXTERNAL CLI$_PRESENT,CLI$_DEFAULTED,CLI$_ABSENT,CLI$_NEGATED
  768. X      CHARACTER*(MXLIN) CIN,CINS,CIN2,CARD
  769. X      CHARACTER*(MLEN)  CFILE,CIFOR,CSCRT,CIGNO,CFORT,CFLOP,CTREE,CTEMP
  770. X      CHARACTER*(MXLIN) CTEMPL
  771. X      CHARACTER*(MLEN) CFORAN
  772. X      LOGICAL LOG
  773. X      CHARACTER*(MLEN) CMMND
  774. XC
  775. XC Log this use of FLOPPY using UMON
  776. XC
  777. X      STATUS = LIB$GET_FOREIGN(CFORAN,,,)
  778. X      LFORAN = MIN(MXLIN,LENOCC(CFORAN))
  779. X      CALL UMLOG('FLOPPY',CFORAN(:LFORAN))
  780. XC
  781. X      LOG = .FALSE.
  782. XC
  783. XC LOG
  784. XC
  785. X      STATUS = CLI$PRESENT('LOG')
  786. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT).OR.
  787. X     &   STATUS.EQ.%LOC(CLI$_DEFAULTED)) THEN
  788. X        LOG = .TRUE.
  789. X      ENDIF
  790. XC
  791. XC INPUT FORTRAN
  792. XC
  793. X      STATUS = CLI$GET_VALUE('P1',CIN)
  794. X      IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS))
  795. X      IB = INDEX(CIN,']')
  796. X      IF(IB.EQ.0) THEN 
  797. X        IP = INDEX(CIN,'.')
  798. X      ELSE
  799. X        IP = INDEX(CIN(IB:),'.')
  800. X      ENDIF
  801. X      IF(IP.EQ.0) CIN = CIN(:LENOCC(CIN))//'.FOR'
  802. X      IF(LOG) WRITE(6,'(2A)') ' Floppy --> Input Fortran  :',
  803. X     &                         CIN(:LENOCC(CIN))
  804. XC
  805. XC EXTRACT STEM NAME
  806. XC
  807. X      NFILE = 0
  808. X   88 CONTINUE   
  809. X      STATUS = LIB$FIND_FILE(CIN,CTEMP,I)
  810. X      IF(.NOT.STATUS.AND.NFILE.EQ.0) THEN
  811. X        IF(LOG)WRITE(6,'(3A)') ' File ',CIN(:LENOCC(CIN)),' absent !'
  812. X        CALL LIB$SIGNAL(%VAL(STATUS))
  813. X        GOTO 1000
  814. X      ENDIF
  815. X      IF(.NOT.STATUS) GOTO 99
  816. X      NFILE = NFILE + 1
  817. X      IF(NFILE.EQ.1) THEN
  818. X        CIFOR = CTEMP
  819. X        IPOSE = INDEX(CTEMP,']')
  820. X        IPOSD = INDEX(CTEMP(IPOSE:MLEN),'.')
  821. X        IF(IPOSE.EQ.0.OR.IPOSD.EQ.0) GOTO 998
  822. X        CFILE = CTEMP(IPOSE+1:IPOSE+IPOSD-2)
  823. X        LEN   = IPOSD-2
  824. X      ELSE IF(NFILE.EQ.2) THEN
  825. X        OPEN(11,FILE='FLOPTEMP.FOR',STATUS='SCRATCH',ERR=999)
  826. X        OPEN(66,FILE=CIFOR(:LENOCC(CIFOR)),STATUS='OLD',READONLY)
  827. X   77   READ(66,'(A)',END=76,ERR=76) CARD
  828. X        WRITE(11,'(A)') CARD
  829. X        GOTO 77
  830. X   76   CLOSE(66)
  831. X      ELSE
  832. X        OPEN(66,FILE=CTEMP(:LENOCC(CTEMP)),STATUS='OLD',READONLY)
  833. X   75   READ(66,'(A)',END=74,ERR=74) CARD
  834. X        WRITE(11,'(A)') CARD
  835. X        GOTO 75
  836. X   74   CLOSE(66)
  837. X      ENDIF
  838. X      GOTO 88
  839. X   99 STATUS = LIB$FIND_FILE_END(I)
  840. X      IF(NFILE.GT.1) REWIND(11)
  841. X      IF(LOG)WRITE(6,'(A,I2,A)') ' Floppy --> ',NFILE,
  842. X     &       ' file(s) of input FORTRAN'
  843. XC
  844. XC OPEN FLOP INPUT FILE
  845. XC
  846. X      CSCRT = CFILE(:LEN)//'.FLOPINP'
  847. X      OPEN(5,FILE=CSCRT(:LEN+8),ACCESS='SEQUENTIAL',
  848. X     &     CARRIAGECONTROL='LIST',STATUS='SCRATCH',ERR=999)
  849. XC
  850. XC WRITE USUAL FLOP INPUT CARDS
  851. XC
  852. X      WRITE(5,'(A)') 'LIST,GLOBAL,TYPE;'
  853. X      WRITE(5,'(A)') 'PRINT,ILLEGAL;'
  854. X      WRITE(5,'(A)') 'OPTIONS,USER;'
  855. XC
  856. XC IGNORE FILE
  857. XC
  858. X      IOLD = 0
  859. X      CIGNO = CFILE(:LEN)//'.FLOPIGN'
  860. X      STATUS = CLI$PRESENT('OLD')
  861. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  862. X        STATUS = CLI$GET_VALUE('OLD',CIN)
  863. X        IF(.NOT.STATUS) THEN
  864. X          CIN = CIGNO
  865. X        ENDIF
  866. X        IOLD = 1
  867. X      ENDIF
  868. X      STATUS = LIB$FIND_FILE(CIN,CTEMP,I)
  869. X      IF(.NOT.STATUS.AND.IOLD.EQ.1) THEN
  870. X      IF(LOG)WRITE(6,'(3A)') ' File ',CIN(:LENOCC(CIN)),' absent !'
  871. X        CALL LIB$SIGNAL(%VAL(STATUS))
  872. X        GOTO 999
  873. X      ENDIF
  874. X      STATUS = LIB$FIND_FILE_END(I)
  875. X      IOPIG = 0
  876. X      IF(IOLD.EQ.1) THEN
  877. XC 
  878. XC COPY OLD IGNORE FILE INTO BUFFER
  879. XC
  880. X        ICHK = 0
  881. X        OPEN(94,FILE=CIN,READONLY,STATUS='OLD')
  882. X        REWIND(94)
  883. X        OPEN(15,FILE=CIGNO(:LIGNO),ACCESS='SEQUENTIAL',
  884. X     &       STATUS='SCRATCH',ERR=999)
  885. X        IOPIG = 1
  886. X   10   READ(94,'(A)',ERR=20,END=20) CARD
  887. X        WRITE(15,'(A)') CARD
  888. X        IF(INDEX(CARD,'CHECK RULE').NE.0) ICHK = 1
  889. X        GOTO 10
  890. X   20   CONTINUE
  891. X        CLOSE(94)
  892. X        CIGNO = CIN
  893. X      ENDIF
  894. X      LIGNO = LENOCC(CIGNO)
  895. X      IF(LOG)WRITE(6,'(A,A)')
  896. X     &' Floppy --> Ignore File    :',CIGNO(:LIGNO)
  897. XC
  898. XC FLOPPY OUTPUT
  899. XC
  900. X      CFLOP = ' '
  901. X      STATUS = CLI$PRESENT('OUTPUT')
  902. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  903. X        CFLOP = CFILE(:LEN)//'.FLOPOUT'
  904. X        STATUS = CLI$GET_VALUE('OUTPUT',CIN)
  905. X        IF(STATUS) CFLOP = CIN
  906. X        IF(LOG)WRITE(6,'(A,A)') ' Floppy --> Output Listing :',
  907. X     &                   CFLOP(:LENOCC(CFLOP))
  908. X      ENDIF
  909. XC
  910. XC SOURCE FILE NUMBERS
  911. XC
  912. X      STATUS = CLI$PRESENT('FULL')
  913. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  914. X        IF(LOG)WRITE(6,'(A,A)')
  915. X     &  ' Floppy --> List source code line numbers'
  916. X        IF(IOPIG.EQ.0) OPEN(15,FILE=CIGNO(:LIGNO),ACCESS='SEQUENTIAL',
  917. X     &                 STATUS='NEW',ERR=999)
  918. X        IOPIG = 1
  919. X        WRITE(15,'(A)') '*FULL'
  920. X      ENDIF
  921. XC
  922. XC IGNORABLE NAMES
  923. XC
  924. X      STATUS = CLI$PRESENT('IGNORE')
  925. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  926. X        IF(LOG)WRITE(6,'(A,A)') ' Floppy --> Ignore following names'
  927. X        IF(IOPIG.EQ.0) OPEN(15,FILE=CIGNO(:LIGNO),ACCESS='SEQUENTIAL',
  928. X     &                 STATUS='NEW',ERR=999)
  929. X        IOPIG = 1
  930. X        NVALU = 0
  931. X   50   STATUS = CLI$GET_VALUE('IGNORE',CIN)
  932. X        IF(STATUS.NE.%LOC(CLI$_ABSENT)) THEN
  933. X          WRITE(15,'(A)') CIN(:LENOCC(CIN))
  934. X          NVALU = NVALU+1
  935. X          IF(LOG)WRITE(6,'(A,I3,A,A)')
  936. X     &    ' Floppy --> Ignore name',NVALU,' = ',CIN(:LENOCC(CIN))
  937. X          GOTO 50
  938. X        ENDIF
  939. X      ENDIF
  940. XC
  941. XC RULE CHECKING
  942. XC
  943. X      STATUS = CLI$PRESENT('CHECKS')
  944. X      IF(STATUS.EQ.%LOC(CLI$_DEFAULTED)) THEN
  945. X        IF(IOPIG.EQ.0) OPEN(15,FILE=CIGNO(:LIGNO),ACCESS='SEQUENTIAL',
  946. X     &                 STATUS='NEW',ERR=999)
  947. X        IOPIG = 1
  948. X        IF(ICHK.EQ.0) THEN 
  949. X           WRITE(15,'(A)') '*CHECK RULE *'
  950. X           IF(LOG) WRITE(6,'(A)') 
  951. X     &     ' Floppy --> Check standard set of rules'
  952. X        ELSE
  953. X           IF(LOG) WRITE(6,'(A,A)') ' Floppy --> Check rules ',
  954. X     &                              'specified in OLD file'
  955. X        ENDIF
  956. X      ELSE IF(STATUS.EQ.%LOC(CLI$_NEGATED)) THEN
  957. X        IF(IOPIG.EQ.0) OPEN(15,FILE=CIGNO(:LIGNO),ACCESS='SEQUENTIAL',
  958. X     &                 STATUS='NEW',ERR=999)
  959. X        IOPIG = 1
  960. X        WRITE(15,'(A)') '*CHECK RULE -99'
  961. X        IF(LOG) WRITE(6,'(A)') ' Floppy --> No rule checking'
  962. X      ELSE IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  963. X        IF(IOPIG.EQ.0) OPEN(15,FILE=CIGNO(:LIGNO),ACCESS='SEQUENTIAL',
  964. X     &                 STATUS='NEW',ERR=999)
  965. X        IOPIG = 1
  966. X        CTEMPL(:MXLIN) = ' '
  967. X        NRULE = 0
  968. X   30   STATUS = CLI$GET_VALUE('CHECKS',CIN)
  969. X        IF(STATUS.NE.%LOC(CLI$_ABSENT)) THEN
  970. X          IF(LENOCC(CIN).EQ.1) CIN(:2) = ' '//CIN(:1)
  971. X          IF(INDEX(CIN,'-').EQ.0.OR.LENOCC(CIN).EQ.2) THEN
  972. X             WRITE(15,'(A,A)') '*CHECK RULE  ',CIN
  973. X          ELSE
  974. X             WRITE(15,'(A,A)') '*CHECK RULE ',CIN
  975. X          ENDIF 
  976. X          IF(CTEMPL.NE.' ') THEN
  977. X             CTEMPL = CTEMPL(:LENOCC(CTEMPL))//','//CIN(:LENOCC(CIN))
  978. X          ELSE
  979. X             CTEMPL = CIN(:LENOCC(CIN))
  980. X          ENDIF 
  981. X          NRULE = NRULE + 1
  982. X          IF(LENOCC(CTEMPL).GT.MXLIN-20) THEN
  983. X            IF(LOG) WRITE(6,'(A,I2,A)') ' Floppy --> Check ',NRULE,
  984. X     &              ' rules :'//CTEMPL(:LENOCC(CTEMPL))
  985. X            CTEMPL(:MXLIN) = ' '
  986. X          ENDIF
  987. X          GOTO 30
  988. X        ENDIF
  989. X        IF(LOG.AND.LENOCC(CTEMPL).GT.0) 
  990. X     &          WRITE(6,'(A,I2,A)')' Floppy --> Check ',NRULE,          
  991. X     &          ' rules :'//CTEMPL(:LENOCC(CTEMPL))
  992. X      ENDIF
  993. XC
  994. XC TREE PROGRAM
  995. XC
  996. X      STATUS = CLI$PRESENT('TREE')
  997. X      CTREE = ' '
  998. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  999. X        WRITE(5,'(A)') 'OPTIONS,TREE;'
  1000. X        CTREE = CFILE(:LEN)//'.FLOPTRE'
  1001. X        IF(LOG)WRITE(6,'(A,A)')
  1002. X     &  ' Floppy --> Tree output    : ',CTREE(:LENOCC(CTREE))
  1003. X      ENDIF
  1004. XC
  1005. XC SPECIAL PROCESSING
  1006. XC
  1007. X      STATUS = CLI$PRESENT('SPECIAL')
  1008. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  1009. X        STATUS= CLI$GET_VALUE('SPECIAL',CIN)
  1010. X        IF(IOPIG.EQ.0) OPEN(15,FILE=CIGNO(:LIGNO),ACCESS='SEQUENTIAL',
  1011. X     &                 STATUS='NEW',ERR=999)
  1012. X        IOPIG = 1
  1013. X        WRITE(15,'(A)') '*'//CIN(:20)
  1014. X        IF(LOG)WRITE(6,'(A,A)')
  1015. X     &   ' Floppy --> Invoke special process for  :',
  1016. X     &                   CIN(:LENOCC(CIN))
  1017. X      ELSE IF(STATUS.EQ.%LOC(CLI$_DEFAULTED)) THEN
  1018. X        IF(IOPIG.EQ.0) OPEN(15,FILE=CIGNO(:LIGNO),ACCESS='SEQUENTIAL',
  1019. X     &                 STATUS='NEW',ERR=999)
  1020. X        IOPIG = 1
  1021. X        WRITE(15,'(A)') '*CHECK RULE *'
  1022. X        IF(LOG)WRITE(6,'(A)')
  1023. X     &   ' Floppy --> Check standard set of rules'          
  1024. X      ENDIF
  1025. XC
  1026. XC TIDY OPTION
  1027. XC
  1028. X      ITIDY = 0
  1029. X      STATUS = CLI$PRESENT('TIDY')
  1030. X      IF(STATUS.NE.%LOC(CLI$_PRESENT)) GOTO 100
  1031. X      ITIDY = 1
  1032. X      IF(LOG)WRITE(6,'(A,A)')   ' Floppy --> FLOP options to tidy code '
  1033. XC
  1034. XC OUTPUT FORTRAN
  1035. XC
  1036. X      CFORT = CFILE(:LEN)//'.FLOPFOR'
  1037. X      STATUS = CLI$PRESENT('FORTRAN')
  1038. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  1039. X        STATUS = CLI$GET_VALUE('FORTRAN',CIN)
  1040. X        IF(STATUS) CFORT = CIN
  1041. X      ENDIF
  1042. X      WRITE(5,'(A)') 'OUTPUT,FULL,COMPRESS;'
  1043. X      IF(LOG)WRITE(6,'(A,A)') ' Floppy --> Output Fortran :',
  1044. X     &                 CFORT(:LENOCC(CFORT))
  1045. XC
  1046. XC INDENT OPTION
  1047. XC
  1048. X      STATUS = CLI$PRESENT('INDENT')
  1049. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  1050. X        STATUS = CLI$GET_VALUE('INDENT',CIN)
  1051. X        IF(LOG)WRITE(6,'(A,A)')
  1052. X     &  ' Floppy --> Indent by ',CIN(:LENOCC(CIN))
  1053. X        WRITE(5,'(A)') 'OPTIONS,INDENT='//CIN(:LENOCC(CIN))//';'
  1054. X      ENDIF
  1055. XC
  1056. XC GROUPF
  1057. XC
  1058. X      STATUS = CLI$PRESENT('GROUPF')
  1059. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  1060. X        IF(LOG)WRITE(6,'(A)')
  1061. X     &  ' Floppy --> Group FORMAT at end of module'
  1062. X        WRITE(5,'(A)') 'STATEMENTS,SEPARATE;'
  1063. X      ENDIF
  1064. XC
  1065. XC GOTOS
  1066. XC
  1067. X      STATUS = CLI$PRESENT('GOTOS')
  1068. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  1069. X        IF(LOG)WRITE(6,'(A)') ' Floppy --> Shift GOTOs to the right'
  1070. X        WRITE(5,'(A)') 'STATEMENTS,GOTO;'
  1071. X      ENDIF
  1072. XC
  1073. XC RENUMBER FORMATS
  1074. XC
  1075. X      STATUS = CLI$PRESENT('FORMAT')
  1076. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  1077. X        STATUS = CLI$PRESENT('FORMAT.START')
  1078. X        CINS = '500'
  1079. X        IF(STATUS.EQ.%LOC(CLI$_PRESENT).OR.
  1080. X     &     STATUS.EQ.%LOC(CLI$_DEFAULTED)) THEN
  1081. X          STATUS = CLI$GET_VALUE('FORMAT.START',CIN)
  1082. X          IF(LOG)WRITE(6,'(A,A)')
  1083. X     &    ' Floppy --> Renumber FORMAT, start at ',
  1084. X     &                      CIN(:LENOCC(CIN))
  1085. X          CINS = CIN
  1086. X        ENDIF
  1087. X        STATUS = CLI$PRESENT('FORMAT.STEP')
  1088. X        CIN2 = '10'
  1089. X        IF(STATUS.EQ.%LOC(CLI$_PRESENT).OR.
  1090. X     &     STATUS.EQ.%LOC(CLI$_DEFAULTED)) THEN
  1091. X          STATUS = CLI$GET_VALUE('FORMAT.STEP',CIN)
  1092. X          IF(LOG)WRITE(6,'(A,A)')
  1093. X     &    ' Floppy --> Renumber FORMAT, step by ',
  1094. X     &                     CIN(:LENOCC(CIN))
  1095. X          CIN2 = CIN
  1096. X        ENDIF
  1097. X        WRITE(5,'(A,A)') 'STATEMENTS,FORMAT='//CINS(:LENOCC(CINS))//','
  1098. X     &                  ,CIN2(:LENOCC(CIN2))//';'
  1099. X      ENDIF
  1100. XC
  1101. XC RENUMBER STATEMENTS
  1102. XC
  1103. X      STATUS = CLI$PRESENT('STMNTS')
  1104. X      IF(STATUS.EQ.%LOC(CLI$_PRESENT)) THEN
  1105. X        STATUS = CLI$PRESENT('STMNTS.START')
  1106. X        CINS = '10'
  1107. X        IF(STATUS.EQ.%LOC(CLI$_PRESENT).OR.
  1108. X     &     STATUS.EQ.%LOC(CLI$_DEFAULTED)) THEN
  1109. X          STATUS = CLI$GET_VALUE('STMNTS.START',CIN)
  1110. X          IF(LOG)WRITE(6,'(A,A)')
  1111. X     &    ' Floppy --> Renumber STATEMENTS, start at',
  1112. X     &                     CIN(:LENOCC(CIN))
  1113. X          CINS = CIN
  1114. X        ENDIF
  1115. X        STATUS = CLI$PRESENT('STMNTS.STEP')
  1116. X        CIN2 = '10'
  1117. X        IF(STATUS.EQ.%LOC(CLI$_PRESENT).OR.
  1118. X     &     STATUS.EQ.%LOC(CLI$_DEFAULTED)) THEN
  1119. X          STATUS = CLI$GET_VALUE('STMNTS.STEP',CIN)
  1120. X          IF(LOG)WRITE(6,'(A,A)')
  1121. X     &    ' Floppy --> Renumber STATEMENTS, step by ',
  1122. X     &                     CIN(:LENOCC(CIN))
  1123. X          CIN2 = CIN
  1124. X        ENDIF
  1125. X        WRITE(5,'(A,A)') 'STATEMENTS,NUMBER='//CINS(:LENOCC(CINS))//','
  1126. X     &                  ,CIN2(:LENOCC(CIN2))//';'
  1127. X      ENDIF
  1128. XC
  1129. X      WRITE(5,'(A)') 'END;'
  1130. XC
  1131. X  100 CONTINUE
  1132. XC
  1133. X      IF(LOG)WRITE(6,'(A)')
  1134. X     &' Floppy --> Finished parsing command string'
  1135. XC
  1136. XC
  1137. XC open LUNs for FLOPPY
  1138. XC
  1139. X      IF(NFILE.EQ.1) THEN
  1140. X      OPEN(11,FILE=CIFOR(:LENOCC(CIFOR)),READONLY,STATUS='OLD',ERR=999)
  1141. X      ENDIF
  1142. X      OPEN(99,FILE='FLOPTEMP.TXT',STATUS='SCRATCH',ERR=999)
  1143. X      IF(IOPIG.NE.0) THEN
  1144. X        REWIND(15)
  1145. X      ELSE
  1146. X        OPEN(15,FILE='FLOPTEMP.IGN',STATUS='SCRATCH',ERR=999)
  1147. X      ENDIF
  1148. X      IFOR = 0
  1149. X      IF(ITIDY.EQ.0) THEN
  1150. X        OPEN(14,FILE='FLOPTEMP.FOR',STATUS='SCRATCH',ERR=999)
  1151. X        IFOR = 1
  1152. X      ELSE
  1153. X        OPEN(14,FILE=CFORT(:LENOCC(CFORT)),STATUS='NEW',
  1154. X     &       CARRIAGECONTROL='LIST',ERR=999)
  1155. X        IFOR = 1
  1156. X      ENDIF
  1157. X      IOUT = 0
  1158. X      IF(CFLOP.NE.' ') THEN
  1159. X        OPEN(6,FILE=CFLOP(:LENOCC(CFLOP)),STATUS='NEW',ERR=999)
  1160. X        IOUT = 1
  1161. X      ENDIF
  1162. X      ITRE = 0
  1163. X      IF(CTREE.NE.' ') THEN
  1164. X        OPEN(50,FILE=CTREE(:LENOCC(CTREE)),STATUS='NEW',
  1165. X     &       FORM='UNFORMATTED',ERR=999)
  1166. X        ITRE = 1
  1167. X      ENDIF
  1168. X      REWIND(5)
  1169. XC
  1170. XC now call floppy
  1171. XC
  1172. X      CALL ALLPRO
  1173. XC
  1174. X      CLOSE(15)
  1175. X      IF(ITRE.EQ.1) CLOSE(50)
  1176. X      IF(IFOR.EQ.1) CLOSE(14)
  1177. X      CLOSE(11)
  1178. X      CLOSE(99)
  1179. X      IF(IOUT.EQ.1) CLOSE(6)
  1180. XC
  1181. XC LOG SUCCESSFUL COMPLETION
  1182. XC
  1183. X      CALL UMLOG('FLOPPY','Successful completion')
  1184. XC
  1185. X      GOTO 2000
  1186. XC
  1187. X  998 CONTINUE
  1188. X      WRITE(6,'(A)') ' Error parsing source Fortran name '
  1189. X      GOTO 1000
  1190. X  999 CONTINUE
  1191. X      WRITE(6,'(A)') ' Error opening a Floppy file '
  1192. X 1000 WRITE(6,500)
  1193. X  500 FORMAT( /,1X,'***********************************************',
  1194. X     &        /,1X,'*                 F L O P P Y                 *',
  1195. X     &        /,1X,'*                   ABORTED                   *',
  1196. X     &        /,1X,'*          in job preparation stage.          *',
  1197. X     &        /,1X,'***********************************************')
  1198. X 2000 CONTINUE
  1199. X      CALL SYS$EXIT(%VAL(1))      
  1200. X      END
  1201. /
  1202. echo 'Part 04 of Floppy complete.'
  1203. exit
  1204.  
  1205.  
  1206.